package ar.edu.utn.frsf.tpae.a2013.g04.service.impl;

import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import ar.edu.utn.frsf.tpae.a2013.g04.persistence.dao.GastoDAO;
import ar.edu.utn.frsf.tpae.a2013.g04.persistence.dao.SolicitudGastoDAO;
import ar.edu.utn.frsf.tpae.a2013.g04.persistence.model.CentroCosto;
import ar.edu.utn.frsf.tpae.a2013.g04.persistence.model.Empleado;
import ar.edu.utn.frsf.tpae.a2013.g04.persistence.model.Gasto;
import ar.edu.utn.frsf.tpae.a2013.g04.persistence.model.SolicitudGasto;
import ar.edu.utn.frsf.tpae.a2013.g04.service.SolicitudGastoService;

public class SolicitudGastoServiceImp implements SolicitudGastoService {

	private SolicitudGastoDAO solDAO;
	private GastoDAO gasDAO;

	@Override
	public Integer nuevaSolicitudGasto(CentroCosto centro, String descripcion,
			Empleado empleado, Double importe) {
		Integer rcode= new Integer(0);

		try {
			SolicitudGasto sol = new SolicitudGasto();
			sol.setCentroCosto(centro);
			sol.setDescripcion(descripcion);
			sol.setEmpleado(empleado);
			sol.setEstado(SolicitudGasto.PENDIENTE);
			sol.setImporteEstimado(importe);
			solDAO.persistir(sol);
			rcode= 0;
		}
		catch (RuntimeException e) {
			e.printStackTrace();
			rcode= -2;
		}
		catch (Exception e) {
			e.printStackTrace();
			rcode= -1;
		}
		return rcode;
	}

	@Override
	public List<SolicitudGasto> listarSolicitudesEmpleado(Empleado empleado) {

		try {
			return solDAO.buscarSolicitudes(empleado);
		}
		catch (RuntimeException e) {
			e.printStackTrace();
			return null;
		}
		catch (Exception e) {
			e.printStackTrace();
			return null;
		}

	}

	@Override
	public Integer agregarGasto(SolicitudGasto sol, Date fecha, String nroFact,
			Double imp) {
		Integer rcode= new Integer(0);

		try {
			if(!SolicitudGasto.APROBADA.equals(sol.getEstado())) {
				rcode= new Integer(-1);
				return rcode;
			}
			Gasto gasto = new Gasto();
			gasto.setFecha(fecha);
			gasto.setImporte(imp);
			gasto.setNumeroFactura(nroFact);
			gasto.setSolicitudGasto(sol);
			gasDAO.persistir(gasto);
			rcode= 0;
		}
		catch (RuntimeException e) {
			e.printStackTrace();
			rcode= -2;
		}
		catch (Exception e) {
			e.printStackTrace();
			rcode= -1;
		}

		return rcode;
	}

	@Override
	public List<SolicitudGasto> listarSolicitudPendientes() {

		try {
			return filtrarPendientes(solDAO.listarPendientes());
		}
		catch (RuntimeException e) {
			e.printStackTrace();
			return null;
		}
		catch (Exception e) {
			e.printStackTrace();
			return null;
		}

	}

	@Override
	public List<SolicitudGasto> listarSolicitudPendientes(Empleado emp) {

		try {
			return filtrarPendientes(solDAO.buscarSolicitudes(emp));
		}
		catch (RuntimeException e) {
			e.printStackTrace();
			return null;
		}
		catch (Exception e) {
			e.printStackTrace();
			return null;
		}

	}

	private List<SolicitudGasto> filtrarPendientes(
			List<SolicitudGasto> buscarSolicitudes) {
		List<SolicitudGasto> ret = new LinkedList<SolicitudGasto>();
		for(SolicitudGasto sol:buscarSolicitudes){
			if(sol.getEstado().equals(SolicitudGasto.PENDIENTE))
				ret.add(sol);
		}
		return ret;
	}

	@Override
	public List<SolicitudGasto> listarSolicitudPendientes(CentroCosto cco) {
		try {
			return filtrarPendientes(solDAO.buscarSolicitudes(cco));
		}
		catch (RuntimeException e) {
			e.printStackTrace();
			return null;
		}
		catch (Exception e) {
			e.printStackTrace();
			return null;
		}

	}

	@Override
	public List<SolicitudGasto> listarSolicitudPendientes(Empleado emp,
			CentroCosto cco) {

		try {
			return filtrarPendientes(solDAO.buscarSolicitudes(emp, cco));
		}
		catch (RuntimeException e) {
			e.printStackTrace();
			return null;
		}
		catch (Exception e) {
			e.printStackTrace();
			return null;
		}

	}

	@Override
	public Integer aprobarSolicitud(SolicitudGasto sol, String comentarios) {
		Integer rcode= new Integer(0);
		try {

			if(!SolicitudGasto.PENDIENTE.equals(sol.getEstado())) {
				rcode= -1;
			}
			else {
				sol.setEstado(SolicitudGasto.APROBADA);
				solDAO.persistir(sol);
				rcode= 0;
			}
		}
		catch (RuntimeException e) {
			e.printStackTrace();
			rcode= -2;
		}
		catch (Exception e) {
			e.printStackTrace();
			rcode= -3;
		}

		return rcode;
	}

	@Override
	public Integer rechazarSolicitud(SolicitudGasto sol, String comentarios) {
		Integer rcode= new Integer(0);

		try {
			if(!SolicitudGasto.PENDIENTE.equals(sol.getEstado()))
				rcode= -1;
			sol.setEstado(SolicitudGasto.RECHAZADA);
			solDAO.persistir(sol);
			rcode= 0;
		}
		catch (RuntimeException e) {
			e.printStackTrace();
			rcode= -2;
		}
		catch (Exception e) {
			e.printStackTrace();
			rcode= -1;
		}
		return rcode;
	}


	/*
	 * GETTERS & SETTERS 
	 */

	public SolicitudGastoDAO getSolicitudGastoDAO() {
		return solDAO;
	}

	@Autowired(required = true)
	public void setSolicitudGastoDAO(SolicitudGastoDAO solDAO) {
		this.solDAO = solDAO;
	}

	public GastoDAO getGastoDAO() {
		return gasDAO;
	}

	@Autowired(required = true)
	public void setGastoDAO(GastoDAO gasDAO) {
		this.gasDAO = gasDAO;
	}

}
